/**
 * 数字转中文大写工具类
 * @author SiKaDi
 * @date 2024
 */

/**
 * 将数字转换为中文大写金额
 * @param {number} num - 要转换的数字
 * @returns {string} 中文大写金额
 * @example
 * numberToChinese(123456789) // "壹亿贰仟叁佰肆拾伍万陆仟柒佰捌拾玖元"
 * numberToChinese(123.45) // "壹佰贰拾叁元肆角伍分"
 * numberToChinese(1000) // "壹仟元整"
 */
export const numberToChinese = (num) => {
  const digits = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'];
  const units = ['', '拾', '佰', '仟'];
  const bigUnits = ['', '万', '亿', '兆'];

  if (num === 0) return '零元整';
  if (num < 0) return '负数';

  // 处理小数部分
  const integerPart = Math.floor(num);
  const decimalPart = Math.round((num - integerPart) * 100);

  // 将数字转换为字符串，便于处理
  const numStr = integerPart.toString();
  const len = numStr.length;
  let result = '';
  let zeroCount = 0;

  // 按四位一组处理
  for (let i = 0; i < len; i++) {
    const digit = parseInt(numStr[i]);
    const pos = len - i - 1;
    const groupIndex = Math.floor(pos / 4);
    const unitIndex = pos % 4;

    if (digit !== 0) {
      // 如果之前有零且不在单位前面，添加一个零
      if (zeroCount > 0 && result) {
        result += '零';
      }
      zeroCount = 0;
      result += digits[digit] + units[unitIndex];
    } else {
      zeroCount++;
    }

    // 添加大单位（万、亿等）
    if (unitIndex === 0 && groupIndex > 0) {
      // 检查这一组是否有非零数字
      const groupHasNonZero = numStr
        .slice(i - 3 >= 0 ? i - 3 : 0, i + 1)
        .split('')
        .some((d, idx) => {
          const checkPos = (i - 3 >= 0 ? i - 3 : 0) + idx;
          return checkPos >= i - 3 && checkPos <= i && parseInt(numStr[checkPos]) !== 0;
        });
      if (groupHasNonZero) {
        result += bigUnits[groupIndex];
        zeroCount = 0;
      }
    }
  }

  // 处理小数部分（角和分）
  if (decimalPart > 0) {
    const jiao = Math.floor(decimalPart / 10);
    const fen = decimalPart % 10;

    result += '元';
    if (jiao > 0) {
      result += digits[jiao] + '角';
    }
    if (fen > 0) {
      result += digits[fen] + '分';
    }
  } else {
    result += '元整';
  }

  return result;
};

/**
 * 格式化金额显示（添加千分位分隔符）
 * @param {number} num - 要格式化的数字
 * @returns {string} 格式化后的金额字符串
 * @example
 * formatAmount(1234567.89) // "1,234,567.89"
 */
export const formatAmount = (num) => {
  if (isNaN(num)) return '0';
  return num.toLocaleString('zh-CN', {
    minimumFractionDigits: 2,
    maximumFractionDigits: 2
  });
};

/**
 * 验证金额格式
 * @param {string|number} value - 要验证的值
 * @returns {boolean} 是否为有效的金额格式
 */
export const isValidAmount = (value) => {
  if (value === '' || value === null || value === undefined) return false;
  const num = parseFloat(value);
  return !isNaN(num) && num >= 0 && num <= 999999999999.99;
};

// 默认导出
export default {
  numberToChinese,
  formatAmount,
  isValidAmount
};
